/**
 * @file show_top.c
 * @author pen
 * @brief 顶部状态栏功能实现
 * 
 * 实现功能：
 * 1. 顶部状态栏容器
 * 2. 实时时间日期显示
 * 3. 天气图标显示
 * 4. 品牌Logo显示
 * 5. 公告按钮及公告页面
 * 6. 菜单按钮及菜单页面
 * 7. 公告图片滑动浏览功能
 * @version 0.1
 * @date 2025-10-16
 * 
 */

#include "show_top.h"
#include "list.h"

// 定义全局变量
static lv_obj_t *img = NULL; // 图片对象
static lv_timer_t *timer = NULL; // 定时器
static lv_timer_t *time_timer = NULL;

// 添加全局变量记录触摸点
static lv_coord_t start_x = 0;
static lv_coord_t start_y = 0;

Dul_pLinkList head = NULL; // 链表头节点

Dul_pLinkList current_node = NULL; // 当前显示的图片节点

uint8_t total_images = 0; // 图片总数

// 全局变量
static lv_obj_t *main_cont = NULL;       // 顶部状态栏主容器

// 时间 日期
static lv_obj_t *time_label = NULL;
static lv_obj_t *date_label = NULL;

static lv_obj_t *logo_img = NULL;

static lv_obj_t *weather_img = NULL;

static lv_obj_t *notice_btn = NULL;  // 公告按钮
static lv_obj_t *menu_btn = NULL;    // 菜单按钮

// 公告页面相关变量
static lv_obj_t *notice_page = NULL;
static lv_obj_t *notice_cont = NULL;

// 菜单页面相关变量
static lv_obj_t *menu_page = NULL;
static lv_obj_t *menu_cont = NULL;

// 时间变量
static uint8_t hours = 0;
static uint8_t minutes = 0;
static uint8_t seconds = 0;

// 添加定时器状态变量
static bool notice_timer_running = false;

/**
 * @brief 创建一个主容器
 * 位置在顶部，用于放置时间标签，logo,公告按钮，菜单按钮
 */
void create_main_obj(void)
{
    // 创建主容器
    main_cont = lv_obj_create(lv_scr_act());
    lv_obj_set_size(main_cont, LV_PCT(100), 45);
    lv_obj_align(main_cont, LV_ALIGN_TOP_LEFT, 0, 0);
    
    // 禁用滚动条显示
    lv_obj_set_scrollbar_mode(main_cont, LV_SCROLLBAR_MODE_OFF);

    // 美化容器样式
    lv_obj_set_style_bg_color(main_cont, lv_color_hex(0x1a1a1a), 0);
    lv_obj_set_style_bg_opa(main_cont, LV_OPA_20, 0);
    lv_obj_set_style_border_width(main_cont, 0, 0);
    lv_obj_set_style_pad_all(main_cont, 10, 0);
    lv_obj_set_style_radius(main_cont, 0, 0);
}

/***********************************************************显示时间*************************************************************/
/**
 * @brief 更新时间显示
 * 
 * 根据当前的时间变量，格式化时间字符串并更新显示
 */
static void update_time_display(void)
{
    char time_str[9]; // 足够存储 "00:00:00\0"
    
    // 格式化时间为 HH:MM:SS
    snprintf(time_str, sizeof(time_str), "%02d:%02d:%02d", hours, minutes, seconds);
    
    // 更新时间标签显示
    lv_label_set_text(time_label, time_str);
}

/**
 * @brief 定时器回调函数
 * 
 * 每秒被调用一次，更新时间变量：
 *  秒数加1
 *  当秒数达到60时，秒数归零，分钟加1
 *  当分钟达到60时，分钟归零，小时加1
 *  当小时达到24时，小时归零
 * 
 * @param timer 定时器对象指针
 */
static void time_update_cb(lv_timer_t * timer)
{
    // 秒数加1
    seconds++;
    
    // 检查是否需要进位
    if (seconds >= 60) 
    {
        seconds = 0;
        minutes++;
        
        if (minutes >= 60) 
        {
            minutes = 0;
            hours++;
            
            if (hours >= 24) 
            {
                hours = 0;
            }
        }
    }
    
    // 更新显示
    update_time_display();
}

/**
 * @brief 创建时间显示标签
 * 
 * 在主容器内创建时间和日期显示标签
 * 
 */
void create_time_label(void)
{    
    // 创建时间标签
    time_label = lv_label_create(main_cont);
    lv_obj_set_style_text_color(time_label, lv_color_hex(0xb2b5ff), 0);
    lv_obj_set_style_text_font(time_label, &lv_font_montserrat_14, 0);
    lv_label_set_text(time_label, "00:00:00");
    lv_obj_align(time_label, LV_ALIGN_TOP_LEFT, 0, 0);
    
    // 创建日期标签
    date_label = lv_label_create(main_cont);
    lv_obj_set_style_text_color(date_label, lv_color_hex(0xb2b5ff), 0);
    lv_obj_set_style_text_font(date_label, &lv_font_montserrat_14, 0);
    lv_label_set_text(date_label, "2024-01-01 Mon");
    lv_obj_align(date_label, LV_ALIGN_TOP_LEFT, 65, 0);
    
    // 创建定时器，每秒更新一次时间
    time_timer = lv_timer_create(time_update_cb, 1000, NULL);
}

/***************************************************************显示天气********************************************************/

/**
 * @brief 显示天气图标
 * 
 * 在状态栏中显示天气图标，使用预设的晴天图标。
 * 实际应用中应根据天气数据动态切换图标。
 */
void show_weather(void)
{
    weather_img = lv_img_create(main_cont);
    lv_obj_align(weather_img, LV_ALIGN_TOP_LEFT, 230, 0);
    lv_img_set_src(weather_img, "S:/pen/showcar/pic/sunny.png");
}
/***************************************************************显示logo********************************************************/
/**
 * @brief 显示logo图片
 * 在顶部中间位置显示logo
 */
void show_logo(void)
{
    logo_img = lv_img_create(main_cont);
    lv_obj_align(logo_img, LV_ALIGN_CENTER, 0, 0); // 居中显示
    lv_img_set_src(logo_img, "S:/pen/showcar/pic/logo.png");
}

/****************************************************************显示公告******************************************************/
/**
 * @brief 启动公告定时器
 */
void start_notice_timer(void)
{
    if (!notice_timer_running && timer) 
    {
        lv_timer_resume(timer);
        notice_timer_running = true;
        // printf("公告定时器启动\n");
    }
}

/**
 * @brief 停止公告定时器
 */
void stop_notice_timer(void)
{
    if (notice_timer_running && timer) 
    {
        lv_timer_pause(timer);
        notice_timer_running = false;
        // printf("公告定时器停止\n");
    }
}

/**
 * @brief 设置公告按钮功能函数
 * 
 * 给按钮添加渲染效果
 * 
 * @param x 要放的位置的横坐标
 * @param y 要放的位置的纵坐标
 * @param w 图片的宽度
 * @param h 图片的高度
 * @param pic_path 图片路径
 * @return lv_obj_t* 
 */
lv_obj_t * lv_notice_imgbtn(int x, int y, int w, int h, char * pic_path)
{
    /* 创建按下状态的样式 */
    static lv_style_t style_pr; // 按下状态样式
    lv_style_init(&style_pr);
    lv_style_set_img_recolor_opa(&style_pr, LV_OPA_30);
    lv_style_set_img_recolor(&style_pr, lv_color_black());
    lv_style_set_transform_width(&style_pr, -5);  // 按下时稍微缩小
    lv_style_set_transform_height(&style_pr, -5);

    /* 创建图像按钮 */
    lv_obj_t * imgbtn = lv_imgbtn_create(main_cont);
    if(imgbtn == NULL) 
    {
        printf("lv_imgbtn_create fail\n");
        return NULL;
    }

    lv_obj_set_size(imgbtn, w, h); // 设置图片按键的大小w*h
    lv_imgbtn_set_src(imgbtn, LV_IMGBTN_STATE_RELEASED, NULL, pic_path, NULL);
    lv_obj_add_style(imgbtn, &style_pr, LV_STATE_PRESSED);

    // 设置按钮位置
    lv_obj_align(imgbtn, LV_ALIGN_TOP_RIGHT, x, y);

    return imgbtn;
}

/**
 * @brief 初始化图片链表
 * 初始化公告显示的图片
 */
void init_image_list(void)  
{
    // 初始化链表
    if (!InitList(&head)) 
    {
        printf("链表初始化失败!\n");
        return;
    }
    
    // 插入图片路径到链表
    InsertLinst(head, 1, "S:/pen/showcar/pic/gongao1.png");
    InsertLinst(head, 2, "S:/pen/showcar/pic/gongao2.png");

    
    // 设置当前节点为第一个图片节点
    current_node = head->next;
    
    // 计算图片总数
    Dul_pLinkList p = head->next;
    while (p != head) 
    {
        total_images++;
        p = p->next;
    }
    
    // printf("图片链表初始化完成，共 %d 张图片\n", total_images);        //调试代码
}

/**
 * @brief 清理图片链表
 * 销毁链表
 */
void cleanup_image_list(void)
{
    if (head != NULL) 
    {
        ListDestory(&head);
        current_node = NULL;
        total_images = 0;
    }
}

/**
 * @brief 显示当前节点的图片
 * 显示广告页面当前节点的图片
 */
void show_nt_current_image(void)
{
    if (current_node == NULL || current_node == head) 
    {
        printf("没有可显示的图片\n");
        return;
    }
    
    if (img != NULL) 
    {
        lv_img_set_src(img, current_node->data);
    }
}

/**
 * @brief 切换到下一张公告图片
 * 
 */
void next_nt_image(void)
{
    if (current_node == NULL || current_node->next == head) 
    {
        // 如果是最后一张，回到第一张
        current_node = head->next;
    } 
    else 
    {
        current_node = current_node->next;
    }
    show_nt_current_image();
}

/**
 * @brief 切换到上一张公告图片
 * 
 */
void prev_nt_image(void)
{
    if (current_node == NULL || current_node->prev == head) 
    {
        // 如果是第一张，跳到最后一张
        current_node = head->prev;
    } 
    else 
    {
        current_node = current_node->prev;
    }
    show_nt_current_image();
}

/**
 * @brief 公告页面定时器回调函数
 * 
 * 每2秒自动切换到下一张公告图片，实现自动轮播效果
 * 
 * @param timer 定时器对象指针
 */
void timer_cb(lv_timer_t *timer) 
{
    if (total_images == 0) 
    {
        return;
    }
    
    // 切换到下一张图片
    next_nt_image();
}

/**
 * @brief 公告页面上一张按钮事件处理
 * 
 * 响应按钮按下事件，切换到上一张公告图片
 * 
 * @param e 事件对象指针
 */
static void event_handler_prev(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    
    if(code == LV_EVENT_PRESSED) 
    {
        prev_nt_image();
        // printf("上一张切换成功\n");                    //调试代码
    }
}

/**
 * @brief 公告页面下一张按钮事件处理
 * 
 * 响应按钮按下事件，切换到下一张公告图片
 * 
 * @param e 事件对象指针
 */
static void event_handler_next(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    
    if(code == LV_EVENT_PRESSED) 
    {
        next_nt_image();
        // printf("下一张切换成功\n");                    //调试代码
    }
}

/**
 * @brief 公告页面触摸按下事件处理
 * 
 * 记录触摸起始点坐标，用于后续滑动距离计算。
 * 
 * @param e 事件对象指针
 */
static void on_img_pressed(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    
    if(code == LV_EVENT_PRESSED) 
    {
        lv_indev_t * indev = lv_indev_get_act();
        if(indev) 
        {
            lv_point_t point;
            lv_indev_get_point(indev, &point);
            start_x = point.x;
            start_y = point.y;
            // printf("按下位置: x=%d, y=%d\n", start_x, start_y);         //调试代码
        }
    }
}

/**
 * @brief 公告页面触摸释放事件处理
 * 
 * 计算滑动距离和方向，根据水平滑动方向切换图片：
 *  向右滑动：上一张图片
 *  向左滑动：下一张图片
 * 
 * @param e 事件对象指针
 */
static void on_img_released(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);
    
    if(code == LV_EVENT_RELEASED) 
    {
        lv_indev_t * indev = lv_indev_get_act();
        
        if(indev) 
        {
            lv_point_t point;
            lv_indev_get_point(indev, &point);
            
            lv_coord_t diff_x = point.x - start_x;
            lv_coord_t diff_y = point.y - start_y;
            
            // printf("释放位置: x=%d, y=%d, 水平移动: %d, 垂直移动: %d\n",  //调试代码
            //        point.x, point.y, diff_x, diff_y);
            
            // 处理水平滑动 - 切换图片
            if(abs(diff_y) < 50)         // 垂直移动小于50像素
            {  
                if(diff_x > 80)          // 向右滑动超过80像素
                {  
                    // printf("检测到向右滑动，切换到上一张\n");               //调试代码
                    prev_nt_image();
                }
                else if(diff_x < -80)   // 向左滑动超过80像素
                {  
                    // printf("检测到向左滑动，切换到下一张\n");               //调试代码
                    next_nt_image();
                }
            }
        }
    }
}

/**
 * @brief 创建公告页面箭头按钮
 * 
 * 创建公告页面专用的箭头按钮，带有按下效果
 * 
 * @param x X坐标位置
 * @param y Y坐标位置
 * @param w 按钮宽度
 * @param h 按钮高度
 * @param pic_path 按钮图标路径
 * @return lv_obj_t* 创建的按钮对象指针
 */
lv_obj_t * lv_arrow1_imgbtn(int x, int y, int w, int h, char * pic_path)
{
    /* 创建按下状态的样式 */
    static lv_style_t style_pr; // 按下状态样式
    lv_style_init(&style_pr);
    lv_style_set_img_recolor_opa(&style_pr, LV_OPA_30);
    lv_style_set_img_recolor(&style_pr, lv_color_black());
    lv_style_set_transform_width(&style_pr, -5);  // 按下时稍微缩小
    lv_style_set_transform_height(&style_pr, -5);

    /* 创建图像按钮 */
    lv_obj_t * imgbtn = lv_imgbtn_create(notice_cont);
    if(imgbtn == NULL) 
    {
        printf("lv_imgbtn_create fail\n");
        return NULL;
    }

    lv_obj_set_size(imgbtn, w, h); // 设置图片按键的大小w*h
    lv_imgbtn_set_src(imgbtn, LV_IMGBTN_STATE_RELEASED, NULL, pic_path, NULL);
    lv_obj_add_style(imgbtn, &style_pr, LV_STATE_PRESSED);

    // 设置按钮位置
    lv_obj_align(imgbtn, LV_ALIGN_TOP_LEFT, x, y);

    return imgbtn;
}

/**
 * @brief 公告按钮事件回调函数
 * 
 * 处理公告按钮的点击事件，跳转到公告页面
 * 
 * @param e 事件对象
 */
static void notice_btn_event_callback(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);

    // 点击按键之后跳转到公告页面
    if(code == LV_EVENT_CLICKED) 
    {
        // printf("公告按钮被点击，跳转到公告页面\n");
        show_notice_page();  // 显示公告页面
    }
}

/**
 * @brief 显示公告图像按钮
 * 
 * 在顶部栏右侧显示公告按钮
 */
void create_notice_button(void)
{
    // 在右上角创建公告按钮
    notice_btn = lv_notice_imgbtn(-100, 0, 30, 30, "S:/pen/showcar/pic/gongao.png");
    if (notice_btn != NULL) 
    {
        lv_obj_add_event_cb(notice_btn, notice_btn_event_callback, LV_EVENT_CLICKED, NULL);      // 添加点击事件回调
        
        // printf("公告按钮创建成功\n");
    } 
    // else 
    // {
    //     printf("公告按钮创建失败\n");
    // }
}

static void close_notice_page(lv_event_t * e);

/**
 * @brief 创建公告页面
 * 
 * 创建公告页面的所有UI元素：
 *  半透明覆盖层
 *  公告内容容器
 *  图片显示区域
 *  左右切换按钮
 *  关闭按钮
 *  自动轮播定时器
 */
void create_notice_page(void)
{
    // 创建公告页面（全屏半透明覆盖层）
    notice_page = lv_obj_create(lv_scr_act());
    lv_obj_set_size(notice_page, LV_PCT(100), LV_PCT(100));
    lv_obj_set_style_bg_color(notice_page, lv_color_hex(0x000000), 0);
    lv_obj_set_style_bg_opa(notice_page, LV_OPA_50, 0);  // 半透明黑色背景
    lv_obj_align(notice_page, LV_ALIGN_TOP_LEFT, 0, 0);
    
    // 创建公告内容容器
    notice_cont = lv_obj_create(notice_page);
    lv_obj_set_size(notice_cont, 622, 350);
    lv_obj_align(notice_cont, LV_ALIGN_CENTER, 0, 0);
    lv_obj_set_style_radius(notice_cont, 0, 0);
    lv_obj_set_style_pad_all(notice_cont, 0, 0);
    
    // 禁用滚动
    lv_obj_set_scrollbar_mode(notice_cont, LV_SCROLLBAR_MODE_OFF);
    lv_obj_clear_flag(notice_cont, LV_OBJ_FLAG_SCROLLABLE);

    // 初始化图片链表
    init_image_list();
    
    // 创建图片对象
    img = lv_img_create(notice_cont);
    lv_obj_align(img, LV_ALIGN_CENTER, 0, 0); // 居中显示

    // 设置图片对象可点击
    lv_obj_add_flag(img, LV_OBJ_FLAG_CLICKABLE);


    // 设置对象大小（确保足够大以接收触摸事件）
    lv_obj_set_size(img, LV_SIZE_CONTENT, LV_SIZE_CONTENT);

    // 显示初始图片
    show_nt_current_image();
    
    // 创建定时器
    timer = lv_timer_create(timer_cb, 2000, NULL); // 每2秒切换一次图片

    // 创建切换上一张图片按钮
    lv_obj_t * left_btn = lv_arrow1_imgbtn(2, 175, 48, 48, "S:/pen/showcar/pic/left.png");
    lv_obj_add_event_cb(left_btn, event_handler_prev, LV_EVENT_PRESSED, NULL);    
    
    // 创建下一张按钮
    lv_obj_t * right_btn = lv_arrow1_imgbtn(572, 175, 48, 48, "S:/pen/showcar/pic/right.png");
    lv_obj_add_event_cb(right_btn, event_handler_next, LV_EVENT_PRESSED, NULL);  
    

    // 添加触摸事件处理（按下和释放）
    lv_obj_add_event_cb(img, on_img_pressed, LV_EVENT_PRESSED, NULL);
    lv_obj_add_event_cb(img, on_img_released, LV_EVENT_RELEASED, NULL);
    
    // 创建关闭按钮
    lv_obj_t *close_btn = lv_imgbtn_create(notice_cont);
    lv_obj_set_size(close_btn, 48, 48);
    lv_obj_align(close_btn, LV_ALIGN_TOP_RIGHT, 0, 0);
    lv_imgbtn_set_src(close_btn, LV_IMGBTN_STATE_RELEASED, NULL, "S:/pen/showcar/pic/close.png", NULL);
    lv_obj_add_event_cb(close_btn, close_notice_page, LV_EVENT_CLICKED, NULL);
    
    // 初始隐藏公告页面
    lv_obj_add_flag(notice_page, LV_OBJ_FLAG_HIDDEN);
    
    // printf("公告页面创建完成\n");
}

/**
 * @brief 关闭公告页面
 * 
 * 隐藏公告页面，返回主界面
 * 
 * @param e 事件对象
 */
static void close_notice_page(lv_event_t * e)
{
    if (notice_page && lv_obj_is_valid(notice_page)) 
    {
        // 停止公告定时器
        stop_notice_timer();

        // 重新启动主界面定时器
        start_screen_timers();  // 启动当前屏幕的定时器

        lv_obj_add_flag(notice_page, LV_OBJ_FLAG_HIDDEN);
        // printf("公告页面已关闭\n");
    }
}

/**
 * @brief 显示公告页面
 * 
 * 显示公告页面，隐藏其他内容
 */
void show_notice_page(void)
{
    if (notice_page && lv_obj_is_valid(notice_page)) 
    {
        // 停止其他页面的定时器
        stop_screen_timers();  // 停止屏幕定时器

        // 启动公告定时器
        start_notice_timer();

        lv_obj_clear_flag(notice_page, LV_OBJ_FLAG_HIDDEN);     // 清除隐藏标志
        lv_obj_move_foreground(notice_page);  // 移到最前面
        // printf("显示公告页面\n");
    } 
    // else 
    // {
    //     printf("公告页面未创建\n");
    // }
}

/**********************************************************顶部菜单按钮及菜单页面*******************************************************/
/**
 * @brief 创建菜单图像按钮
 * 
 * 创建带有按下效果的菜单按钮，用于打开菜单页面。
 * 
 * @param x X坐标偏移量（相对于右上角）
 * @param y Y坐标偏移量（相对于右上角）
 * @param w 按钮宽度
 * @param h 按钮高度
 * @param pic_path 按钮图标路径
 * @return lv_obj_t* 创建的按钮对象指针
 */
lv_obj_t * lv_menu_imgbtn(int x, int y, int w, int h, char * pic_path)
{
    /* 创建按下状态的样式 */
    static lv_style_t style_pr; // 按下状态样式
    lv_style_init(&style_pr);
    lv_style_set_img_recolor_opa(&style_pr, LV_OPA_30);
    lv_style_set_img_recolor(&style_pr, lv_color_black());
    lv_style_set_transform_width(&style_pr, -5);  // 按下时稍微缩小
    lv_style_set_transform_height(&style_pr, -5);

    /* 创建图像按钮 */
    lv_obj_t * imgbtn = lv_imgbtn_create(main_cont);
    if(imgbtn == NULL) 
    {
        printf("lv_imgbtn_create fail\n");
        return NULL;
    }

    lv_obj_set_size(imgbtn, w, h); // 设置图片按键的大小w*h
    lv_imgbtn_set_src(imgbtn, LV_IMGBTN_STATE_RELEASED, NULL, pic_path, NULL);
    lv_obj_add_style(imgbtn, &style_pr, LV_STATE_PRESSED);

    // 设置按钮位置
    lv_obj_align(imgbtn, LV_ALIGN_TOP_RIGHT, x, y);

    return imgbtn;
}

/**
 * @brief 菜单按钮事件回调函数
 * 
 * 处理菜单按钮的点击事件，显示/隐藏菜单页面
 * 
 * @param e 事件对象
 */
static void menu_btn_event_callback(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);

    if(code == LV_EVENT_CLICKED) 
    {
        if (menu_page && lv_obj_is_valid(menu_page)) 
        {
            if (lv_obj_has_flag(menu_page, LV_OBJ_FLAG_HIDDEN)) 
            {
                // 显示菜单页面时停止其他定时器
                stop_screen_timers();
                stop_notice_timer();

                // 显示菜单页面
                lv_obj_clear_flag(menu_page, LV_OBJ_FLAG_HIDDEN);
                lv_obj_move_foreground(menu_page);
                
                // 隐藏公告页面
                if (notice_page && lv_obj_is_valid(notice_page)) 
                {
                    lv_obj_add_flag(notice_page, LV_OBJ_FLAG_HIDDEN);
                    stop_notice_timer();
                }
            } 
            else 
            {
                start_screen_timers();
                // 隐藏菜单页面
                lv_obj_add_flag(menu_page, LV_OBJ_FLAG_HIDDEN);
            }
        }
    }
}

/**
 * @brief 创建菜单按钮
 * 
 * 在顶部栏右侧显示菜单按钮
 */
void create_menu_button(void)
{
    // 在右上角创建菜单按钮，放在公告按钮左侧
    menu_btn = lv_menu_imgbtn(-30, 0, 30, 30, "S:/pen/showcar/pic/menu.png");
    if (menu_btn != NULL) 
    {
        lv_obj_add_event_cb(menu_btn, menu_btn_event_callback, LV_EVENT_CLICKED, NULL);   // 添加点击事件回调
    }
}

/**
 * @brief 关闭菜单页面
 * 
 * 隐藏菜单页面
 * 
 * @param e 事件对象
 */
static void close_menu_page(lv_event_t * e)
{
    if (menu_page && lv_obj_is_valid(menu_page)) 
    {
        lv_obj_add_flag(menu_page, LV_OBJ_FLAG_HIDDEN);
    }
}

/**
 * @brief 菜单项点击事件回调
 * 
 * 处理菜单项的点击事件，可扩展具体功能
 * 
 * @param e 事件对象
 */
static void menu_item_event_callback(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    
    if(code == LV_EVENT_CLICKED) 
    {
        lv_obj_t * target = lv_event_get_target(e);                            // 获取被点击的菜单项对象
        const char * text = lv_label_get_text(lv_obj_get_child(target, 0));    // 获取菜单项文本内容
        
        // 根据点击的菜单项执行相应操作
        // 这里可以添加具体的菜单项处理逻辑
        

    }
}

/**
 * @brief 创建菜单页面
 * 
 * 创建菜单页面的所有UI元素：
 * - 半透明覆盖层
 * - 侧边菜单容器
 * - Logo显示
 * - 菜单项列表
 * - 关闭按钮
 */
void create_menu_page(void)
{
    // 创建菜单页面（全屏半透明覆盖层）
    menu_page = lv_obj_create(lv_scr_act());
    lv_obj_set_size(menu_page, LV_PCT(100), LV_PCT(100));
    lv_obj_set_style_bg_color(menu_page, lv_color_hex(0x000000), 0);
    lv_obj_set_style_bg_opa(menu_page, LV_OPA_30, 0);  // 半透明黑色背景
    lv_obj_set_style_pad_all(menu_page, 0, 0);  // 移除内边距
    lv_obj_set_style_border_width(menu_page, 0, 0);  // 移除边框
    lv_obj_align(menu_page, LV_ALIGN_TOP_LEFT, 0, 0);
    
    
    // 创建菜单内容容器（占屏幕1/4大小）
    menu_cont = lv_obj_create(menu_page);
    lv_obj_set_size(menu_cont, LV_PCT(25), LV_PCT(100)); // 宽度1/4屏幕，高度100%
    lv_obj_set_style_bg_color(menu_cont, lv_color_hex(0x2d2d2d), 0);
    lv_obj_set_style_bg_opa(menu_cont, LV_OPA_100, 0);
    lv_obj_set_style_radius(menu_cont, 0, 0);
    lv_obj_set_style_pad_all(menu_cont, 0, 0);
    lv_obj_set_style_border_width(menu_cont, 0, 0);

    lv_obj_align(menu_cont, LV_ALIGN_TOP_RIGHT, 0, 0);
    
    // 阻止点击菜单容器内部时关闭菜单
    lv_obj_add_flag(menu_cont, LV_OBJ_FLAG_CLICKABLE);
    lv_obj_clear_flag(menu_cont, LV_OBJ_FLAG_CLICKABLE); // 允许点击内部按钮
    
    // 创建退出按钮（右上角）
    lv_obj_t *close_btn = lv_imgbtn_create(menu_cont);
    lv_obj_set_size(close_btn, 48, 48);
    lv_obj_align(close_btn, LV_ALIGN_TOP_RIGHT, -10, 10);
    lv_imgbtn_set_src(close_btn, LV_IMGBTN_STATE_RELEASED, NULL, "S:/pen/showcar/pic/close.png", NULL);
    lv_obj_add_event_cb(close_btn, close_menu_page, LV_EVENT_CLICKED, NULL);

    // 在菜单容器内创建logo
    lv_obj_t *menu_logo = lv_img_create(menu_cont);
    lv_img_set_src(menu_logo, "S:/pen/showcar/pic/logo.png");
    lv_obj_align(menu_logo, LV_ALIGN_CENTER, 0, -150); // 居中显示
    
    // 创建菜单项容器
    lv_obj_t *menu_items_cont = lv_obj_create(menu_cont);
    lv_obj_set_size(menu_items_cont, LV_PCT(90), LV_PCT(70));
    lv_obj_align(menu_items_cont, LV_ALIGN_TOP_MID, 0, 130);
    lv_obj_set_style_bg_opa(menu_items_cont, LV_OPA_0, 0);
    lv_obj_set_style_border_width(menu_items_cont, 0, 0);
    lv_obj_set_style_pad_all(menu_items_cont, 0, 0);
    
    // 启用垂直滚动，禁用水平滚动
    lv_obj_set_scrollbar_mode(menu_items_cont, LV_SCROLLBAR_MODE_AUTO);  // 自动显示滚动条
    lv_obj_set_scroll_dir(menu_items_cont, LV_DIR_VER); // 只允许垂直滚动
    lv_obj_add_flag(menu_items_cont, LV_OBJ_FLAG_SCROLLABLE); // 启用滚动

    // 定义菜单项文本数组
    const char *menu_items[] = {"车型", "口碑", "科技", "品牌故事", "服务", "小程序", "车主志", "LADY", "关于我们"};
    int item_count = sizeof(menu_items) / sizeof(menu_items[0]);
    
    // 创建所有菜单项
    for (int i = 0; i < item_count; i++) {
        // 创建菜单项按钮
        lv_obj_t *item_btn = lv_btn_create(menu_items_cont);
        lv_obj_set_size(item_btn, LV_PCT(100), 40);
        lv_obj_align(item_btn, LV_ALIGN_TOP_MID, 0, i * 45);
        lv_obj_set_style_bg_color(item_btn, lv_color_hex(0x1a1a2a), 0); 
        lv_obj_set_style_bg_color(item_btn, lv_color_hex(0x2a2a3a), LV_STATE_PRESSED);
        lv_obj_set_style_bg_opa(item_btn, LV_OPA_0, 0); // 透明背景
        lv_obj_set_style_bg_opa(item_btn, LV_OPA_50, LV_STATE_PRESSED); // 按下时半透明
        lv_obj_set_style_radius(item_btn, 0, 0);
        lv_obj_set_style_border_width(item_btn, 0, 0);
        
        // 创建菜单项标签
        lv_obj_t *item_label = lv_label_create(item_btn);
        lv_label_set_text(item_label, menu_items[i]);
        lv_obj_set_style_text_color(item_label, lv_color_white(), 0);
        lv_obj_set_style_text_font(item_label, &chinese_ziku, 0);
        lv_obj_set_style_text_align(item_label, LV_TEXT_ALIGN_LEFT, 0);
        lv_obj_align(item_label, LV_ALIGN_LEFT_MID, 20, 0);
        
        // 添加点击事件
        lv_obj_add_event_cb(item_btn, menu_item_event_callback, LV_EVENT_CLICKED, NULL);
        
        // 添加分隔线（除了最后一个）
        if (i < item_count - 1) {
            lv_obj_t *item_separator = lv_line_create(menu_items_cont);
            static lv_point_t item_line_points[] = {{10, 0}, {LV_PCT(100)-10, 0}};      // 水平线端点
            lv_line_set_points(item_separator, item_line_points, 2);                    // 设置线条端点
            lv_obj_set_style_line_width(item_separator, 1, 0);
            lv_obj_set_style_line_color(item_separator, lv_color_hex(0x404060), 0);
            lv_obj_align(item_separator, LV_ALIGN_TOP_MID, 0, (i + 1) * 45 - 2);        // 位于菜单项之间
        }
    }

    // 初始隐藏菜单页面
    lv_obj_add_flag(menu_page, LV_OBJ_FLAG_HIDDEN);
}


/**
 * @brief 初始化顶部状态栏所有元素
 * 
 * 一次性初始化顶部状态栏的所有功能模块：
 * 1. 主容器
 * 2. 时间日期显示
 * 3. 天气图标
 * 4. Logo
 * 5. 公告按钮和页面
 * 6. 菜单按钮和页面
 * 
 */
void init_top_bar(void)
{
    create_main_obj();      // 创建主容器
    create_time_label();    // 创建时间显示
    show_weather();         // 显示天气图标
    show_logo();            // 显示logo
    create_notice_button(); // 创建公告按钮
    create_notice_page();   // 创建公告页面（隐藏状态）
    create_menu_button();   // 创建菜单按钮
    create_menu_page();     // 创建菜单页面（隐藏状态）
    // printf("顶部栏初始化完成\n");
}